/*
 * TPoro.h
 *
 *  Created on: 04/11/2009
 *      Author: javier
 */

#ifndef TPORO_H_
#define TPORO_H_

using namespace std;

/** \file tporo.h
 *
 * \brief Estructura de la clase TPoro.
 *
 * Definiciones de métodos y atributos de clase TPoro.
 */



/** \brief Clase TPoro.
 *
 * Estructura de la clase TPoro.
 *
 */
class TPoro
{

	/** \brief Sobrecarga del operador "<<", función amiga.
	 *
	 * Función amiga que se encarga de mostrar por pantalla, en un formato determinado un TPoro que le pasemos.
	 *
	 * \param os Ostream donde guardaremos la informacion que queremos mostrar.
	 * \param p TPoro que queremos mostrar.
	 *
	 * \return La funcion devuelve un ostream&.
	 */
	friend ostream& operator<<(ostream &, const TPoro &);

	public:

		/** \brief Constructor de TPoro.
		 *
		 * Constructor de TPoro, pone los valores por defecto de los atributos del objeto.
		 */
		TPoro();

		/** \brief Constructor sobrecargado de TPoro.
		 *
		 * Este constructor permite construir TPoro's dandole valor a sus miembros.
		 * \param px Entero con el valor de la coordenada x.
		 * \param py Entero con el valor de la coordenada y.
		 * \param pvol Double con el valor del volumen que deseamos.
		 */
		TPoro(int, int, double);

		/** \brief Constructor sobrecargado de TPoro, por segunda vez.
		 *
		 * Este constructor de igual forma que el anterior nos permite construir un TPoro con sus argumentos inicializados como queramos, con el cambio de que ahora recibe un char.
		 * \param px Entero con el valor de la coordenada x.
		 * \param py Entero con el valor de la coordenada y.
		 * \param pvol Double con el valor del volumen que deseamos.
		 * \param pcolor Puntero a char que apunta a una cadena con el nombre del color que deseemos ponerle al TPoro.
		 */
		TPoro(int, int, double, char *);

		/** \brief Constructor de copia de Tporo.
		 *
		 * ESte constructor crea un TPoro con los valores del que le pasemos.
		 * \param p TPoro del cual copiaremos su contenido al crear el nuevo objeto.
		 */
		TPoro( const TPoro &);

		/** \brief Destructor de la clase TPoro.
		 *
		 * Destructor, pone todo a 0, si color apunta a un char, lo borra.
		 */
		~TPoro();

		/** \brief Sobrecarga del operador asignacion.
		 *
		 * Sobrecarga del operador asignacion para TPoro, con el podremos realizar asignaciones entre objetos de esta clase.
		 * \param p TPoro del cual obtenemos los miembros para asignar.
		 * \return Devuelve un TPoro&, el objeto que realiza la llamada.
		 */
		TPoro& operator=( const TPoro &);

		/** \brief Sobrecarga del operador igualdad.
		 *
		 * Comprueba si hay igualdad entre dos TPoros, declarada constante.
		 * \param p TPoro del lado derecho de la comprobación.
		 * \return Devuelve un bool, true si son iguales, false si son distintos.
		 */
		bool operator==( const TPoro &) const;

		/** \brief Sobrecarga del operador desigualdad.
		 *
		 * Funciona de manera contraria al operador igualdad.
		 * \param p TPoro con el que comparamos.
		 * \return Devuelve un bool, true si son distintos, false si son iguales.
		 */
		bool operator!=( const TPoro &) const;

		/** \brief Método Posicion
		 *
		 *  Posicion nos permite modificar las componentes x e y del objeto que la llama.
		 *  \param px Entero con el nuevo valor de la x.
		 *  \param py Entero con el nuevo valor de la y.
		 *
		 */
		void Posicion( int, int);

		/** \brief Método Volumen.
		 *
		 * Volumen permite modificar el miembro volumen del objeto que lo llama.
		 * \param pvolumen Double con el nuevo valor de volumen.
		 */
		void Volumen( double );

		/** \brief Metodo Color
		 *
		 * Color, permite cambiar el miembro color del objeto que lo llama.
		 * \param pcolor Char* con el valor del nuevo color que queremos asignar.
		 */
		void Color(char *);

		/** \brief Metodo PosicionX.
		 *
		 * Este metodo nos devuelve un entero con la posicion x, es decir el valor del miembro x del objeto que lo llama.
		 * \return Devuelve un entero, el miembro x del objeto que llama.
		 */
		int PosicionX() const;
		/** \brief Metodo PosicionY.
		 *
		 * Este metodo nos devuelve un entero con la posicion y, es decir el valor del miembro y del objeto que lo llama.
		 * \return Devuelve un entero, el miembro y del objeto que llama.
		 */
		int PosicionY() const;

		/** \brief Metodo Volumen.
		 *
		 * Este metodo nos devuelve el volumen del objeto que lo llama.
		 * \return Devuelve el volumen de tipo double.
		 */
		double Volumen() const;

		/** Metodo Color.
		 *
		 * Nos devuelve el char* con el valor del color del objeto que lo llama.
		 * \return Devuelve un char*.
		 */
		char * Color() const;

		/** Metodo EsVacio.
		 *
		 * Devuelve true si un TPoro esta vacio, es decir, todas sus componentes estan a 0 y color apuntando a NULL.
		 * \return Devuelve un bool, true si esta vacio, false si no.
		 */
		bool EsVacio();


	private:

		/** \brief Entero x.
		 *
		 * Esta componente indica el valor de la coordenada x donde esta situado el objeto TPoro que lo contiene.
		 */
		int x;

		/** \brief Entero y.
		 *
		 * Esta componente indica el valor de la coordenada y donde esta situado el objeto TPoro que lo contiene.
		 */
		int y;

		/** \brief Double volumen.
		 *
		 * Indica el valor de la variable volumen, que sera el volumen del TPoro.
		 */
		double volumen;

		/** Char* color.
		 *
		 * Este char contiene el color del TPoro.
		 */
		char* color;

};

#endif /* TPORO_H_ */
